home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 45 / Amiga Format CD45 (1999-09)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-11].iso / -serious- / programming / basic / messages / prog_b.bb2 < prev    next >
Text File  |  1999-08-09  |  3KB  |  116 lines

  1. ; RUN THIS FROM THE CLI ONCE COMPILED
  2. ; Run the other program before this one from the CLI, i.e.
  3. ; 1> run prog_a <RETURN>
  4. ; 1> run prog_b <RETURN>
  5.  
  6. ; You will need blitzlibs:amigalibs.res resident
  7. ; **********************************************
  8.  
  9. ; This program finds the message port created by the other program,
  10. ; sends it a message then waits for the reply.
  11.  
  12. ; Needs to be same type of structure as the other program
  13. NEWTYPE.NrMessage
  14.   SystemMsg.Message
  15.   number.w
  16. End NEWTYPE
  17.  
  18. ; Declare a pointer to the public message port and our reply port
  19. DEFTYPE.MsgPort *msgp, *replymsgp
  20.  
  21. ; Declare a pointer to a message
  22. DEFTYPE.NrMessage *nrmsg, *msg
  23.  
  24. ; Start of main program
  25. ; Allocate some memory for message (public memory and clear)
  26. *nrmsg = AllocMem_(SizeOf.NrMessage, #MEMF_PUBLIC|#MEMF_CLEAR)
  27.  
  28. ; Check if memory has been allocated
  29. If *nrmsg = 0
  30.   NPrint "B: Not enough memory for message"
  31.   End
  32. End If
  33.  
  34. ; Try to find program A's message port
  35. *msgp = FindPort_("NrPort")
  36. If *msgp = 0
  37.   NPrint "B: Could not find A's message port"
  38.   Goto _end2
  39. End If
  40.  
  41. ; Create a reply port. Note that you do not have to name it or give it
  42. ; a priority, as it will not be added to public port list
  43. *replymsgp = CreateMsgPort_
  44.  
  45. ; Check if message port was created
  46. If *replymsgp = 0
  47.   NPrint "B: Not enough memory to create reply port"
  48.   Goto _end2
  49. End If
  50.  
  51. ; Initialise the message, set type to NT_MESSAGE
  52. *nrmsg\SystemMsg\mn_Node\ln_Type = #NT_MESSAGE
  53.  
  54. ; Give the message a pointer to our reply port
  55. *nrmsg\SystemMsg\mn_ReplyPort = *replymsgp
  56.  
  57. ; Set the length of our message
  58. *nrmsg\SystemMsg\mn_Length = SizeOf.NrMessage
  59.  
  60. ; Set the message number (data we wish to pass)
  61. *nrmsg\number = Rnd(32000)
  62.  
  63. ; Inform the user
  64. NPrint "B: Everything is ready!"
  65. NPrint "B: Sending value: ",*nrmsg\number
  66.  
  67. ; Send the message
  68. PutMsg_ *msgp, *nrmsg
  69.  
  70. ; After we have sent our message, we cannot access or alter the message
  71. ; until we receive a reply from it
  72. NPrint "B: Message sent, waiting..."
  73.  
  74. ; Wait at reply port. See prog A source for alternative method of waiting
  75. WaitPort_ *replymsgp
  76.  
  77. ; Try to receive as many messages as possible. Note that we do not need
  78. ; to reply to messages here, because we created them, and this port is
  79. ; only used as a reply port
  80. *msg = GetMsg_(*replymsgp)
  81. While *msg
  82.   ; We may now examine the message
  83.   NPrint "B: We have received a reply"
  84.   NPrint "B: Value received: ",*msg\number
  85.   ; You may normally need to free the messages here, because you are probably
  86.   ; finished with them when you receive the reply. But we only sent one, so
  87.   ; we don't need to track any stuff.
  88.   *msg = GetMsg_(*replymsgp)
  89. Wend
  90.  
  91. DeleteMsgPort_ *replymsg
  92.  
  93. _end2:
  94. ; If we have allocated memory for message, free it
  95. If *nrmsg Then FreeMem_ *nrmsg, SizeOf.NrMessage
  96.  
  97. NPrint "The end"
  98. End
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.